
Sora Fujimoto
AI Solutions Architect

このガイドでは、PHPとCapSolver APIを使用してAWS WAF CAPTCHAおよびChallengeページをバイパスする包括的なステップバイステップのチュートリアルを提供します。CAPTCHA(HTTP 405)とChallenge(HTTP 202)の応答を検出するロジック、必要なパラメータの抽出、および結果として得られるaws-waf-tokenクッキーを使用して保護されたリソースにアクセスする方法について詳しく説明します。
AWS CAPTCHAについて掘り下げ、それを実装するPHPソルバーについて説明します。開発者やウェブスクリーパーにとって、CAPTCHAに遭遇することは大きな障害となる可能性がありますが、適切なツールがあれば、これは管理可能なタスクになります。
AWS WAF(Web Application Firewall)は、ウェブアプリケーションを一般的なウェブの攻撃から保護するセキュリティサービスです。これは、リクエストが正当な人間ユーザーから発信されていることを確認するために、CAPTCHAとChallengeの2つの主要なアクションを提供します。
| アクション | 目的 | HTTPステータスコード | 必要な解決方法 |
|---|---|---|---|
| Challenge | クライアントセッションが標準的なブラウザであることを確認する静かなバックグラウンド検証を実行します。 | 202 Accepted |
JavaScriptチャレンジを解決してトークンを取得する必要があります。 |
| CAPTCHA | エンドユーザーが視覚的なパズルを解決して人間であることを証明する必要があります。 | 405 Method Not Allowed |
ページから特定のパラメータを抽出する必要がある視覚的なCAPTCHAを解決する必要があります。 |
CAPTCHAまたはChallengeが成功裏に解決されると、AWS WAFは有効なトークンを発行し、aws-waf-tokenという名前のクッキーとして返されます。このトークンは、WAFの保護を回避するために後続のリクエストに含める必要があります。
CapSolverは、AWS WAFによって提示される静かなChallengeと視覚的なCAPTCHAの両方を処理する強力なAPIソリューションを提供します。このガイドでは、PHPのcURLライブラリを使用して必要なロジックを実装する方法について説明します。
このソリューションのコアは、CapSolver APIへの2つの主要なAPIコール、createTaskでCAPTCHA/Challengeを送信し、getTaskResultで解決結果を取得するものです。
<?php
// --- 設定 ---
$PROXY = "http://username:password@host:port"; // オプション: プロキシの詳細を置き換えてください(例: AntiAwsWafTask 用)
$PAGE_URL = "https://norway-meetup.aws.wslab.no/"; // AWS WAFで保護されたターゲットURLに置き換えてください
$CLIENT_KEY = "YourPayPerUsage"; // CAPSOLVER APIキーに置き換えてください
/**
* CapSolver APIにタスクを送信します。
* @param array $payload タスクペイロード、タイプとパラメータを含みます。
* @return array APIの応答、タスクIDを含みます。
*/
function createTask($payload) {
global $CLIENT_KEY;
$ch = curl_init();
echo("タスクを作成しています...\n");
curl_setopt($ch, CURLOPT_URL, 'https://api.capsolver.com/createTask');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['clientKey' => $CLIENT_KEY, 'task' => $payload]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
/**
* CapSolver APIからタスク結果をポーリングします。
* @param string $taskId 検証するタスクID
* @return array APIの応答、解決内容を含みます。
*/
function getTaskResult($taskId) {
global $CLIENT_KEY;
do {
echo("解決待ち...\n");
sleep(1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.capsolver.com/getTaskResult');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['clientKey' => $CLIENT_KEY, 'taskId' => $taskId]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (isset($data['status']) && $data['status'] == "ready") {
return $data;
}
// getTaskResultの結果取得エラー処理
if (isset($data['errorId']) && $data['errorId'] != 0) {
echo("タスク結果の取得エラー: " . $data['errorDescription'] . "\n");
return null;
}
} while(true);
}
/**
* 必要なタスクタイプを使用してAWS WAF ChallengeまたはCaptchaを解決します。
* @param string $taskType CapSolverタスクタイプ(AntiAwsWafTaskまたはAwsCaptchaTask)
* @param array $params タスクに必要なパラメータ
* @return string|null aws-waf-tokenクッキーの値または失敗時はnull
*/
function solveAwsWaf($taskType, $params) {
global $PAGE_URL, $PROXY;
$payload = [
'type' => $taskType,
'websiteURL' => $PAGE_URL,
'proxy' => $PROXY,
];
// タスクの特定パラメータをマージ
$payload = array_merge($payload, $params);
// リクエストをよりクリーンにするために空値をクリーンアップ
$payload = array_filter($payload, function($value) {
return $value !== "" && $value !== null;
});
$taskData = createTask($payload);
if (isset($taskData['taskId'])) {
$result = getTaskResult($taskData['taskId']);
if ($result && isset($result['solution']['cookie'])) {
return $result['solution']['cookie'];
}
}
return null;
}
主要なロジックは、保護されたページに初期リクエストを送信し、HTTPステータスコードをチェックしてChallenge(202)またはCAPTCHA(405)が必要かを判断することです。その後、正規表現を使用してHTMLレスポンスボディから必要なパラメータを抽出します。
// --- 主な実行ロジック ---
// 1. 保護されたページへの初期リクエスト
$ch = curl_init($PAGE_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$cookie = null;
echo("初期HTTPコード: " . $httpCode . "\n");
if ($httpCode == 202) {
// --- Challenge (202)処理 ---
echo("Challengeが検出されました (HTTP 202)。パラメータを抽出しています...\n");
// challenge.jsのURLを抽出
preg_match('/<script src="([^"]*token.awswaf.com[^"]*)"/', $response, $matches);
$awsChallengeJS = $matches[1] ?? null;
if ($awsChallengeJS) {
$params = ['awsChallengeJS' => $awsChallengeJS];
$cookie = solveAwsWaf("AntiAwsWafTask", $params);
} else {
echo("エラー: Challenge用のawsChallengeJSが見つかりません。\n");
}
} elseif ($httpCode == 405) {
// --- CAPTCHA (405)処理 ---
echo("CAPTCHAが検出されました (HTTP 405)。パラメータを抽出しています...\n");
// ページコンテンツからパラメータを抽出
preg_match('/<script src="([^"]*token.awswaf.com[^"]*)"/', $response, $matches);
$awsChallengeJS = $matches[1] ?? null;
preg_match('/"key":"(.*?)"/', $response, $matches);
$awsKey = $matches[1] ?? null;
preg_match('/"iv":"(.*?)"/', $response, $matches);
$awsIv = $matches[1] ?? null;
preg_match('/"context":"(.*?)"/', $response, $matches);
$awsContext = $matches[1] ?? null;
if ($awsKey && $awsIv && $awsContext) {
$params = [
'awsKey' => $awsKey,
'awsIv' => $awsIv,
'awsContext' => $awsContext,
'awsChallengeJS' => $awsChallengeJS // オプションですが推奨されます
];
// 注意: 視覚的なCAPTCHAのタスクタイプは通常AntiAwsWafTaskのままですが、CapSolver側で解決タイプは送信されたパラメータによって決定されます。
$cookie = solveAwsWaf("AntiAwsWafTask", $params);
} else {
echo("エラー: CAPTCHA用のKey、IV、またはContextパラメータが見つかりません。\n");
}
}
// 3. トークンを使用して保護されたリソースにアクセス
if ($cookie) {
echo("aws-waf-tokenを成功裏に取得しました。最終リクエストを行います...\n");
$ch = curl_init($PAGE_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// aws-waf-tokenクッキーを設定
curl_setopt($ch, CURLOPT_COOKIE, "aws-waf-token=" . $cookie);
$finalResponse = curl_exec($ch);
curl_close($ch);
echo "\n--- 最終ページのコンテンツ ---\n";
echo $finalResponse;
echo "\n--------------------------\n";
} else {
echo("AWS WAFチャレンジ/CAPTCHAの解決に失敗しました。\n");
}
?>
元のコードでは、solveAwsChallengeとsolveAwsCaptchaという別々の関数が使用されており、パラメータ名の不一致(key、iv、context と awsKey、awsIv、awsContext)がありました。最適化されたコードでは、これらを1つのsolveAwsWaf関数に統合し、最新のCapSolver APIドキュメントに従って一貫性を保証しています。このアプローチは、モジュール性が高く、メンテナンスが容易です。
このロジックは、ウェブスクリーピングや自動化タスクに非常に効果的です。他の言語で作業している場合は、"PythonでAWS CAPTCHA/Challengeを解決する方法" [https://www.capsolver.com/blog/how-to-solve-aws-captcha-challenge-with-python] などのガイドも提供しており、同様のAPIパターンを使用しています。
AWS WAFのChallengeとCAPTCHAメカニズムは、ボット対策として効果的ですが、乗り越えることは不可能ではありません。PHPでロバストな検出と解決ロジックを実装し、CapSolver APIの力を活用することで、開発者は保護されたリソースにアクセスするために必要なaws-waf-tokenを信頼性を持って取得できます。安定した大規模な自動化には、専門的なソルバーを統合することが不可欠です。詳しくは、AWS WAF CAPTCHAソルバー: スクレイパー用のトークンと画像解決 などを参照してください。
aws-waf-tokenクッキーの値を取得することです。AntiAwsWafTaskタスクタイプは、ChallengeとCAPTCHAの両方を解決し、必要なパラメータがCapSolver側で解決タイプを決定します。preg_matchはHTMLソースから動的なパラメータ(awsChallengeJS、awsKey、awsIv、awsContext)を抽出するために不可欠です。A: HTTPステータスコードは、必要なWAFアクションのタイプを判断する最も信頼性の高い指標です。202 Acceptedステータスコードは、静かなChallengeが有効であり、最小限のパラメータで済むことを示します。405 Method Not Allowedステータスコードは、視覚的なCAPTCHAが有効であり、ページのJavaScript変数からkey、iv、contextなどの特定のパラメータを抽出する必要があることを示します。
AntiAwsWafTaskとAntiAwsWafTaskProxyLessの違いは何ですか?A: 両方のタスクタイプはAWS WAFチャレンジを解決するために設計されています。主な違いはプロキシの要件です。AntiAwsWafTaskでは、リクエストペイロードに独自のプロキシを提供する必要があります。AntiAwsWafTaskProxyLessでは、CapSolverがプロキシの使用を内部で処理するため、プロキシは必要ありません。大規模なウェブスクリーピングでは、匿名性を維持し、IPのブロックを避けるためにプロキシを使用することが一般的に推奨されます。
key、iv、またはcontextパラメータを検出できていません。どうすればいいですか?A: これらのパラメータは動的に生成され、通常は<script>タグや隠し入力フィールド内にJavaScript変数として埋め込まれています。preg_matchが失敗した場合、ターゲットサイトのWAF実装が変更されている可能性があります。最新のブロックされたページのHTMLソースを確認し、正規表現を更新する必要があります。
A: サードパーティサービスを使わずにAWS WAFチャレンジを手動で解決するのは非常に困難で、自動化には現実的ではありません。Challengeアクションでは複雑でオブフスケートされたJavaScriptを実行する必要があります。CAPTCHAアクションでは画像認識パズルを解決する必要があります。CapSolverのようなサードパーティサービスは、リアルタイムでこれらのチャレンジを解決するための高度なAIと大規模なインフラを使用しており、自動化が可能になります。すべてのタイプのCAPTCHA用に自社でソルバーを構築するのは一般的にコスト効果が低く、信頼性がありません。
aws-waf-tokenの有効期限はどのくらいですか?A: aws-waf-tokenの有効期限は、保護されたサイトのAWS WAF構成によって異なりますが、通常は10〜30分です。トークンが期限切れになると、新しいトークンを取得するために、初期リクエスト、検出、タスク送信のプロセスを繰り返す必要があります。
ブラウザオートメーションにおけるAmazon AWS WAF CAPTCHAチャレンジの解決をエキスパートの戦略でマスターしましょう。CapSolverを統合して、スムーズで効率的なオートメーションワークフローを学びます。このガイドはトークンベースおよび分類ベースのソリューションをカバーしています。

PythonとCapSolverを使用したAWS WAFの課題の処理に関する実用的なガイド、保護されたウェブサイトへのスムーズなアクセスを可能にします
